package com.lzh.tiktok.user.controller;

import com.lzh.common.constant.TiktokConstant;
import com.lzh.common.exception.BizCodeEnum;
import com.lzh.common.utils.JwtUtils;
import com.lzh.tiktok.user.entity.UserEntity;
import com.lzh.tiktok.user.exception.UsernameExistException;
import com.lzh.tiktok.user.service.UserService;
import com.lzh.tiktok.user.vo.UserInfoResponseVo;
import com.lzh.tiktok.user.vo.UserResponseVo;
import com.lzh.tiktok.user.vo.UserVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @author lizhihang
 * @create 2023-01-16 20:08
 */

/**
 * 登录和注册接口需要放行，其他接口需要验证token
 */
@RestController
@RequestMapping("douyin/user")
@Slf4j
public class UserController {
    @Autowired
    UserService userService;

    //todo JSR303后端校验
    //todo 明文密码在网络中使用是否安全
    @PostMapping("/register")
    public UserResponseVo register(@RequestParam("username") String username, @RequestParam("password") String password) {
        UserEntity user;
        try {
            //完成注册返回用户信息
            user = userService.register(username, password);
        } catch (UsernameExistException e) {
            log.error(e.getMessage());
            return UserResponseVo.fail(e.getMessage());
        }
        //根据当前用户id，用户名，生成token（令牌）
        String token = JwtUtils.createToken(Long.valueOf(user.getUserId()), username);
        return UserResponseVo.success(user.getUserId(), token);
    }


    //todo 处理过于复杂，可以优化
    @PostMapping("/login")
    public UserResponseVo login(@RequestParam("username") String username, @RequestParam("password") String password) {
        /*UserResponseVo responseVo = userService.login(username, password);
        if (responseVo.getStatus_code() == BizCodeEnum.USERNAME_INPUT_EXCEPTION.getCode() ||
                responseVo.getStatus_code() == BizCodeEnum.PASSWORD_INPUT_EXCEPTION.getCode()) {
            responseVo.setStatus_code(TiktokConstant.responseStatus.FAIL_STATUS.getCode());
        } else {
            responseVo.setStatus_code(TiktokConstant.responseStatus.SUCCESS_STATUS.getCode());
        }*/

        UserEntity user = userService.login(username, password);
        if (user == null) {
            return UserResponseVo.fail("账号或密码错误");
        }
        //账号和密码都正确
        String token = JwtUtils.createToken(Long.valueOf(user.getUserId()), username);
        return UserResponseVo.success(user.getUserId(), token);
    }

    /**
     * todo 未完成
     * 查看用户信息，有可能是自己的信息，有可能是别人的信息
     * 有可能是未登录的时候，有可能是登录的时候
     * 未登录不带token，登录带token
     *
     * @param userId 查看的当前信息的这个用户的userId
     * @param token  当前登录的用户的token（包括了username和userId）
     * @return
     */
    @GetMapping("/")
    public UserInfoResponseVo getUserInfo(@RequestParam(value = "user_id", required = false) Integer userId,
                                          @RequestParam("token") String token) {
        if (userId == null) {
            //什么时候userId为null?查看自己的页面信息的时候？
            userId = JwtUtils.getUserId(token).intValue();
        }
        UserVo user = userService.getUserInfo(userId, token);
        return UserInfoResponseVo.suceess(user);
    }


}
